{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## TM test of first order and for complex media\n",
    "In the TE polarization, we have demonstrated that quadrant sorting works. However, in the TM polarization, a naive quadrant sort seems to be ineffective, specifically when any of the $\\epsilon <0$.\n",
    "\n",
    "However, since we know what the correct answer should look like, it appears that the correct sorting procedure is simple.\n",
    "1. Any real k MUST BE OF ONE SIGN ONLY (POSITIVE)\n",
    "2. pure imaginaries must be of ONE SIGN ONLY (POSITIVE)\n",
    "3. nonzero real and nonzero imaginary k must come in complex conjugate pairs (so in $k^2$ space, they correspond to two separate eigenvalues)\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "## same as the analytic case but with the fft\n",
    "import numpy as np\n",
    "import sys\n",
    "sys.path.append('/Users/nathanzhao/src/Rigorous-Coupled-Wave-Analysis')\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "from numpy.linalg import cond\n",
    "import cmath;\n",
    "from scipy.fftpack import fft, fftfreq, fftshift, rfft\n",
    "from scipy import linalg as LA\n",
    "from numpy.linalg import solve as bslash\n",
    "from RCWA_1D_functions.grating_fft.grating_conv import *\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "def nonHermitianEigenSorter(eigenvalues):\n",
    "    N = len(eigenvalues);\n",
    "    sorted_indices=[];\n",
    "    sorted_eigs = [];\n",
    "    for i in range(N):\n",
    "        eig = eigenvalues[i];\n",
    "        if(np.real(eig)>0 and np.imag(eig) == 0):\n",
    "            sorted_indices.append(i); sorted_eigs.append(eig);\n",
    "        elif(np.real(eig)==0 and np.imag(eig) > 0): \n",
    "            sorted_indices.append(i); sorted_eigs.append(eig);\n",
    "        elif(np.real(eig)>0 and abs(np.imag(eig)) > 0): \n",
    "            sorted_indices.append(i); sorted_eigs.append(eig);\n",
    "    return sorted_eigs, sorted_indices;\n",
    "\n",
    "def eigenMatcher():\n",
    "    return;"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "/Users/nathanzhao/anaconda3/lib/python3.7/site-packages/numpy/core/numeric.py:538: ComplexWarning: Casting complex values to real discards the imaginary part\n",
      "  return array(a, dtype, copy=False, order=order)\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Moharam et. al Formulation for stable and efficient implementation for RCWA\n",
    "plt.close(\"all\")\n",
    "'''\n",
    "1D TM implementation of PLANAR DIFFRACTiON\n",
    "STILL NOT WORKING YET\n",
    "\n",
    "only: sign convention is exp(-ikr) (is the positive propagating wave), so loss is +  not - \n",
    "source for fourier decomps is from the paper: Formulation for stable and efficient implementation of\n",
    "the rigorous coupled-wave analysis of binary gratings by Moharam et. al\n",
    "'''\n",
    "\n",
    "L0 = 1e-6;\n",
    "e0 = 8.854e-12;\n",
    "mu0 = 4*np.pi*1e-8;\n",
    "fill_factor = 0.3; # 50% of the unit cell is the ridge material\n",
    "\n",
    "\n",
    "num_ord = 10; #INCREASING NUMBER OF ORDERS SEEMS TO CAUSE THIS THING TO FAIL, to many orders induce evanescence...particularly\n",
    "               # when there is a small fill factor\n",
    "PQ = 2*num_ord+1;\n",
    "indices = np.arange(-num_ord, num_ord+1)\n",
    "\n",
    "n_ridge = 3.48; #3.48;              # ridge\n",
    "n_groove = 1;                # groove (unit-less)\n",
    "lattice_constant = 0.7;  # SI units\n",
    "# we need to be careful about what lattice constant means\n",
    "# in the gaylord paper, lattice constant exactly means (0, L) is one unit cell\n",
    "\n",
    "\n",
    "d = 0.46;               # thickness, SI units\n",
    "\n",
    "Nx = 2*256;\n",
    "eps_r = -n_groove**2*np.ones((2*Nx, 1)); #put in a lot of points in eps_r\n",
    "border = int(2*Nx*fill_factor);\n",
    "eps_r[0:border] = n_ridge**2;\n",
    "\n",
    "\n",
    "fft_fourier_array = grating_fft(eps_r);\n",
    "x = np.linspace(-lattice_constant,lattice_constant,2*Nx);\n",
    "period = lattice_constant;\n",
    "fft_reconstruct = fourier_reconstruction_general(x, period, num_ord, fft_fourier_array);\n",
    "\n",
    "fourier_array_analytic = grating_fourier_array(Nx, fill_factor, n_ridge, -n_groove);\n",
    "analytic_reconstruct = fourier_reconstruction(x, period, num_ord, n_ridge, -n_groove, fill_factor)\n",
    "\n",
    "\n",
    "plt.figure();\n",
    "plt.plot(np.abs(fft_fourier_array[Nx-20:Nx+20]), linewidth=2)\n",
    "plt.plot(np.abs(fourier_array_analytic[Nx-20:Nx+20]));\n",
    "plt.legend(('fft', 'analytic'))\n",
    "plt.show()\n",
    "\n",
    "plt.figure();\n",
    "plt.plot(x,fft_reconstruct)\n",
    "plt.plot(x,analytic_reconstruct);\n",
    "plt.legend(['fft', 'analytic'])\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(21, 21)\n",
      "(21, 21)\n"
     ]
    }
   ],
   "source": [
    "\n",
    "##construct convolution matrix\n",
    "E = np.zeros((2 * num_ord + 1, 2 * num_ord + 1)); E = E.astype('complex')\n",
    "p0 = Nx; #int(Nx/2);\n",
    "p_index = np.arange(-num_ord, num_ord + 1);\n",
    "q_index = np.arange(-num_ord, num_ord + 1);\n",
    "fourier_array = fft_fourier_array;#fourier_array_analytic;\n",
    "detected_pffts = np.zeros_like(E);\n",
    "for prow in range(2 * num_ord + 1):\n",
    "    # first term locates z plane, 2nd locates y coumn, prow locates x\n",
    "    row_index = p_index[prow];\n",
    "    for pcol in range(2 * num_ord + 1):\n",
    "        pfft = p_index[prow] - p_index[pcol];\n",
    "        detected_pffts[prow, pcol] = pfft;\n",
    "        E[prow, pcol] = fourier_array[p0 + pfft];  # fill conv matrix from top left to top right\n",
    "\n",
    "## FFT of 1/e;\n",
    "inv_fft_fourier_array = grating_fft(1/eps_r);\n",
    "##construct convolution matrix\n",
    "E_conv_inv = np.zeros((2 * num_ord + 1, 2 * num_ord + 1));\n",
    "E_conv_inv = E_conv_inv.astype('complex')\n",
    "p0 = Nx;\n",
    "p_index = np.arange(-num_ord, num_ord + 1);\n",
    "for prow in range(2 * num_ord + 1):\n",
    "    # first term locates z plane, 2nd locates y coumn, prow locates x\n",
    "    for pcol in range(2 * num_ord + 1):\n",
    "        pfft = p_index[prow] - p_index[pcol];\n",
    "        E_conv_inv[prow, pcol] = inv_fft_fourier_array[p0 + pfft];  # fill conv matrix from top left to top right\n",
    "\n",
    "print(E_conv_inv.shape);\n",
    "print(E.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Observations to note\n",
    "We can see that floating point precision can completely alter the sign when we take a square root of the beigenvals."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "wavelength: 0.5\n",
      "conditioning of AO: 807\n",
      "[0, 2, 4, 6, 7, 10, 11, 14, 15, 17, 18, 22, 23, 26, 27, 28, 29, 30, 31, 32, 33]\n",
      "21\n",
      "[-0.        +14.27968352j -0.        -14.27968352j\n",
      " -0.         +6.26262847j -0.         -6.26262847j\n",
      "  7.04273129 +0.j         -7.04273129 -0.j\n",
      "  6.12914703 +0.26175774j  6.12914703 -0.26175774j\n",
      " -6.12914703 +0.26175774j -6.12914703 -0.26175774j\n",
      "  5.80024207 -0.j          5.43160805 -0.j\n",
      " -5.80024207 +0.j         -5.43160805 +0.j\n",
      "  4.72158748 -0.j         -0.         +3.27070354j\n",
      " -0.         -3.27070354j  4.27663874 +0.j\n",
      " -0.         +2.49432288j -4.72158748 +0.j\n",
      "  0.         -2.49432288j -4.27663874 +0.j\n",
      "  3.53777929 +0.11519421j  3.53777929 -0.11519421j\n",
      " -3.53777929 +0.11519421j -3.53777929 -0.11519421j\n",
      "  3.2310896  -0.j          2.82270981 -0.j\n",
      "  2.209526   -0.j          1.85423242 -0.j\n",
      "  1.3463863  +0.5063975j   1.3463863  -0.5063975j\n",
      "  1.12982512 +0.j          1.14902712 -0.j\n",
      " -3.2310896  +0.j         -2.82270981 +0.j\n",
      " -2.209526   -0.j         -1.3463863  +0.5063975j\n",
      " -1.85423242 +0.j         -1.3463863  -0.5063975j\n",
      " -1.14902712 +0.j         -1.12982512 -0.j        ]\n",
      "[1.00721165e-15-1.42796835e+01j 6.50234783e-16-6.26262847e+00j\n",
      " 7.04273129e+00-5.72568947e-16j 6.12914703e+00-2.61757737e-01j\n",
      " 6.12914703e+00+2.61757737e-01j 5.80024207e+00+2.83767196e-16j\n",
      " 5.43160805e+00+3.19851915e-16j 1.47495137e-16-3.27070354e+00j\n",
      " 4.72158748e+00-1.28604520e-15j 4.27663874e+00+9.62095391e-17j\n",
      " 2.38246010e-15-2.49432288e+00j 3.53777929e+00-1.15194214e-01j\n",
      " 3.53777929e+00+1.15194214e-01j 3.23108960e+00-6.15887346e-16j\n",
      " 2.82270981e+00-7.68421211e-16j 2.20952600e+00+8.98016071e-16j\n",
      " 1.85423242e+00-5.64792466e-16j 1.34638630e+00+5.06397498e-01j\n",
      " 1.34638630e+00-5.06397498e-01j 1.12982512e+00+5.07300485e-16j\n",
      " 1.14902712e+00-4.39696130e-16j]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "wavelength: 0.5620689655172414\n",
      "conditioning of AO: 661\n",
      "[1, 3, 7, 8, 9, 12, 13, 19, 20, 21, 22, 23, 25, 27, 29, 30, 31, 32, 33, 34, 35]\n",
      "21\n",
      "[-0.        -16.0782037j  -0.        +16.0782037j\n",
      "  0.         -7.18562107j  0.         +7.18562107j\n",
      " -7.89550793 +0.j         -7.1090287  -0.37215548j\n",
      " -7.1090287  +0.37215548j  7.89550793 +0.j\n",
      "  7.1090287  +0.37215548j  7.1090287  -0.37215548j\n",
      " -6.49599476 -0.j         -6.00807186 +0.j\n",
      "  6.49599476 -0.j          6.00807186 +0.j\n",
      " -5.27088545 -0.j         -0.         -3.20855172j\n",
      " -4.76237658 +0.j         -4.19993695 -0.2240147j\n",
      " -4.19993695 +0.2240147j  -0.         +3.20855172j\n",
      "  5.27088545 -0.j          4.76237658 -0.j\n",
      "  4.19993695 +0.2240147j   4.19993695 -0.2240147j\n",
      " -0.         -2.12521036j -0.         +2.12521036j\n",
      " -3.57591111 -0.j          3.57591111 -0.j\n",
      " -3.07582105 -0.j          3.07582105 +0.j\n",
      "  2.23881408 -0.24926682j  2.23881408 +0.24926682j\n",
      "  1.98756756 +0.j          1.81141672 +0.j\n",
      "  1.10243526 +0.j          1.06757428 +0.j\n",
      " -2.23881408 -0.24926682j -2.23881408 +0.24926682j\n",
      " -1.98756756 -0.j         -1.81141672 -0.j\n",
      " -1.10243526 -0.j         -1.06757428 +0.j        ]\n",
      "[2.64466993e-15-1.60782037e+01j 1.93815136e-15+7.18562107e+00j\n",
      " 7.89550793e+00-2.29822689e-15j 7.10902870e+00-3.72155480e-01j\n",
      " 7.10902870e+00+3.72155480e-01j 6.49599476e+00-1.02836183e-16j\n",
      " 6.00807186e+00-1.08683453e-15j 1.42000786e-16+3.20855172e+00j\n",
      " 5.27088545e+00+1.82088101e-16j 7.01788707e-16+2.12521036e+00j\n",
      " 4.76237658e+00-2.41848615e-16j 4.19993695e+00-2.24014696e-01j\n",
      " 4.19993695e+00+2.24014696e-01j 3.57591111e+00-1.29692208e-15j\n",
      " 3.07582105e+00-4.98655363e-16j 2.23881408e+00-2.49266815e-01j\n",
      " 2.23881408e+00+2.49266815e-01j 1.98756756e+00-5.87408098e-16j\n",
      " 1.81141672e+00+1.38478383e-15j 1.10243526e+00+9.28612286e-18j\n",
      " 1.06757428e+00+8.40568336e-16j]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "wavelength: 0.6241379310344828\n",
      "conditioning of AO: 1817\n",
      "[1, 3, 4, 5, 6, 10, 11, 13, 15, 16, 17, 19, 21, 22, 23, 24, 26, 34, 37, 38, 39]\n",
      "21\n",
      "[ 0.        -17.87394403j  0.        +17.87394403j\n",
      " -0.         -8.09281449j -0.         +8.09281449j\n",
      "  8.75019808 +0.j          8.0440548  -0.37981621j\n",
      "  8.0440548  +0.37981621j -8.75019808 +0.j\n",
      " -8.0440548  -0.37981621j -8.0440548  +0.37981621j\n",
      "  7.19357945 +0.j          6.62556589 -0.j\n",
      " -7.19357945 -0.j          5.81656818 -0.j\n",
      " -6.62556589 -0.j          5.25477484 +0.j\n",
      "  4.8183857  -0.06439663j  4.8183857  +0.06439663j\n",
      "  0.         -3.13719346j -0.         +3.13719346j\n",
      " -5.81656818 -0.j          3.91758001 +0.j\n",
      "  3.35963222 +0.j          2.8417689  -0.31767344j\n",
      "  2.8417689  +0.31767344j  0.         -1.5727683j\n",
      " -0.         +1.5727683j  -5.25477484 +0.j\n",
      " -4.8183857  +0.06439663j -4.8183857  -0.06439663j\n",
      " -3.91758001 +0.j         -3.35963222 +0.j\n",
      " -2.8417689  -0.31767344j -2.8417689  +0.31767344j\n",
      "  2.12803559 +0.j         -2.12803559 -0.j\n",
      " -1.7195947  -0.j          1.7195947  -0.j\n",
      "  1.02124826 -0.j          1.04040501 -0.j\n",
      " -1.02124826 -0.j         -1.04040501 +0.j        ]\n",
      "[1.09001331e-15-1.78739440e+01j 1.24593230e-15+8.09281449e+00j\n",
      " 8.75019808e+00+1.48677091e-15j 8.04405480e+00-3.79816206e-01j\n",
      " 8.04405480e+00+3.79816206e-01j 7.19357945e+00+6.66249341e-16j\n",
      " 6.62556589e+00-3.09265811e-16j 5.81656818e+00+2.61186566e-16j\n",
      " 5.59078918e-16-3.13719346e+00j 5.25477484e+00-1.54072499e-16j\n",
      " 4.81838570e+00-6.43966259e-02j 4.81838570e+00+6.43966259e-02j\n",
      " 3.62722264e-15-1.57276830e+00j 3.91758001e+00+1.41567860e-16j\n",
      " 3.35963222e+00+8.26895334e-16j 2.84176890e+00+3.17673443e-01j\n",
      " 2.84176890e+00-3.17673443e-01j 2.12803559e+00+6.75461554e-16j\n",
      " 1.71959470e+00-3.06773517e-15j 1.02124826e+00+3.14337564e-15j\n",
      " 1.04040501e+00-6.87049154e-16j]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "wavelength: 0.6862068965517241\n",
      "conditioning of AO: 6195\n",
      "[1, 3, 7, 8, 9, 11, 13, 15, 19, 20, 21, 23, 28, 30, 31, 32, 36, 38, 39, 40, 41]\n",
      "21\n",
      "[-0.        -19.66774754j -0.        +19.66774754j\n",
      " -0.         -8.98908845j -0.         +8.98908845j\n",
      " -9.6062857  -0.j         -8.95852874 -0.33759763j\n",
      " -8.95852874 +0.33759763j  9.6062857  -0.j\n",
      "  8.95852874 -0.33759763j  8.95852874 +0.33759763j\n",
      " -7.892489   -0.j          7.892489   +0.j\n",
      " -7.25400577 +0.j          7.25400577 +0.j\n",
      " -6.35310964 -0.j          6.35310964 -0.j\n",
      " -5.72964124 +0.j         -5.7506102  +0.j\n",
      " -5.11171867 +0.j          5.72964124 +0.j\n",
      "  5.7506102  -0.j          5.11171867 +0.j\n",
      " -0.         -3.05566371j  0.         +3.05566371j\n",
      " -4.24361606 +0.j         -3.65164815 +0.j\n",
      " -3.44494433 -0.j         -3.21856136 +0.j\n",
      "  4.24361606 +0.j         -2.26637127 +0.j\n",
      "  3.65164815 +0.j          3.44494433 -0.j\n",
      "  3.21856136 +0.j         -1.77606714 +0.j\n",
      " -0.81475631 -0.56624442j -0.81475631 +0.56624442j\n",
      "  2.26637127 -0.j         -1.02136139 +0.j\n",
      "  0.81475631 -0.56624442j  0.81475631 +0.56624442j\n",
      "  1.77606714 -0.j          1.02136139 +0.j        ]\n",
      "[2.91088125e-15-1.96677475e+01j 4.54744649e-15+8.98908845e+00j\n",
      " 9.60628570e+00-2.77594742e-15j 8.95852874e+00-3.37597628e-01j\n",
      " 8.95852874e+00+3.37597628e-01j 7.89248900e+00+6.77309607e-16j\n",
      " 7.25400577e+00-1.01365122e-15j 6.35310964e+00+2.06645314e-15j\n",
      " 5.72964124e+00-3.11240219e-15j 5.75061020e+00-6.94669817e-16j\n",
      " 5.11171867e+00+1.08498678e-15j 8.18345478e-17-3.05566371e+00j\n",
      " 4.24361606e+00-2.02009171e-16j 3.65164815e+00+3.40649820e-16j\n",
      " 3.44494433e+00+5.47167593e-15j 3.21856136e+00-5.61393027e-15j\n",
      " 2.26637127e+00-2.45214845e-15j 8.14756308e-01-5.66244419e-01j\n",
      " 8.14756308e-01+5.66244419e-01j 1.77606714e+00+4.24293611e-16j\n",
      " 1.02136139e+00+7.82331245e-16j]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "wavelength: 0.7482758620689655\n",
      "conditioning of AO: 1422\n",
      "[0, 2, 7, 8, 9, 12, 13, 17, 18, 19, 21, 22, 32, 33, 34, 35, 37, 38, 39, 40, 41]\n",
      "21\n",
      "[ -0.        +21.46014223j   0.        -21.46014223j\n",
      "   0.         +9.87744503j   0.         -9.87744503j\n",
      " -10.46342862 -0.j          -9.86030712 +0.2423741j\n",
      "  -9.86030712 -0.2423741j   10.46342862 -0.j\n",
      "   9.86030712 +0.2423741j    9.86030712 -0.2423741j\n",
      "  -8.59239477 -0.j          -7.88744909 -0.j\n",
      "   8.59239477 +0.j           7.88744909 -0.j\n",
      "  -6.86364828 +0.j          -6.52218819 -0.j\n",
      "  -6.2485352  -0.j           6.86364828 -0.j\n",
      "   6.52218819 +0.j           6.2485352  -0.j\n",
      "  -5.52487438 +0.j           5.52487438 +0.j\n",
      "   0.         +2.96276029j   0.         -2.96276029j\n",
      "  -3.94754482 +0.j          -4.45716807 -0.j\n",
      "  -4.36075889 +0.j          -3.32670952 -0.j\n",
      "  -2.39072657 +0.j          -1.39240353 +0.62162225j\n",
      "  -1.39240353 -0.62162225j  -1.85426355 +0.j\n",
      "   3.94754482 -0.j           4.45716807 -0.j\n",
      "   4.36075889 +0.j           3.32670952 +0.j\n",
      "  -1.00310956 -0.j           2.39072657 +0.j\n",
      "   1.39240353 +0.62162225j   1.39240353 -0.62162225j\n",
      "   1.00310956 +0.j           1.85426355 -0.j        ]\n",
      "[2.48220144e-15-2.14601422e+01j 3.13690161e-16-9.87744503e+00j\n",
      " 1.04634286e+01-6.58823237e-16j 9.86030712e+00+2.42374096e-01j\n",
      " 9.86030712e+00-2.42374096e-01j 8.59239477e+00+2.37801852e-16j\n",
      " 7.88744909e+00-5.54791629e-16j 6.86364828e+00+2.24879064e-15j\n",
      " 6.52218819e+00-4.07886477e-15j 6.24853520e+00-8.55958441e-16j\n",
      " 5.52487438e+00+6.81893695e-16j 2.05349522e-16-2.96276029e+00j\n",
      " 3.94754482e+00+4.78002090e-16j 4.45716807e+00-5.78427447e-15j\n",
      " 4.36075889e+00+9.19866399e-15j 3.32670952e+00-1.72156964e-15j\n",
      " 2.39072657e+00-2.05247421e-15j 1.39240353e+00+6.21622250e-01j\n",
      " 1.39240353e+00-6.21622250e-01j 1.85426355e+00-3.33437105e-15j\n",
      " 1.00310956e+00+6.85020452e-17j]\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 4 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "## IMPORTANT TO NOTE: the indices for everything beyond this points are indexed from -num_ord to num_ord+1\n",
    "\n",
    "## alternate construction of 1D convolution matrix\n",
    "zeros = np.zeros((PQ, PQ))\n",
    "\n",
    "I = np.eye(2 * num_ord + 1)\n",
    "## simulation parameters\n",
    "theta = (0)*np.pi/180;\n",
    "spectra = list();\n",
    "spectra_T = list();\n",
    "\n",
    "wavelength_scan = np.linspace(0.5,2.3,30)\n",
    "## construct permittivity harmonic components E\n",
    "#fill factor = 0 is complete dielectric, 1 is air\n",
    "\n",
    "# E is now the convolution of fourier amplitudes\n",
    "for wvlen in wavelength_scan:\n",
    "    j = cmath.sqrt(-1);\n",
    "    lam0 = wvlen;     k0 = 2 * np.pi / lam0; #free space wavelength in SI units\n",
    "    print('wavelength: ' + str(wvlen));\n",
    "    ## =====================STRUCTURE======================##\n",
    "\n",
    "    ## Region I: reflected region (half space)\n",
    "    n1 = 1;#cmath.sqrt(-1)*1e-12; #apparently small complex perturbations are bad in Region 1, these shouldn't be necessary\n",
    "\n",
    "    ## Region 2; transmitted region\n",
    "    n2 = 1;\n",
    "\n",
    "    #from the kx_components given the indices and wvln\n",
    "    kx_array = k0*(n1*np.sin(theta) + indices*(lam0 / lattice_constant)); #0 is one of them, k0*lam0 = 2*pi\n",
    "    k_xi = kx_array;\n",
    "    ## IMPLEMENT SCALING: these are the fourier orders of the x-direction decomposition.\n",
    "    KX = np.diag((k_xi/k0)); #singular since we have a n=0, m= 0 order and incidence is normal\n",
    "\n",
    "    ## construct matrix of Gamma^2 ('constant' term in ODE):\n",
    "    B = (KX@bslash(E, KX) - I); #conditioning of this matrix is not bad, A SHOULD BE SYMMETRIC\n",
    "\n",
    "    AO = np.block([[zeros, np.linalg.inv(E_conv_inv)],[B, zeros]])\n",
    "    beigenvals, bigW = LA.eig(AO);\n",
    "    print('conditioning of AO: %d'%np.linalg.cond(AO))\n",
    "#     print('conditioning of big block: '+str(np.linalg.cond(AO)))\n",
    "    #try rounding...\n",
    "    rounded_beigenvals = np.array([round(i,10) for i in beigenvals])\n",
    "    #print(rounded_beigenvals)\n",
    "#     quadrant_sort = [1 if np.real(i)>=0 and np.imag(i)>=0 else 0 for i in rounded_beigenvals];\n",
    "#     sorted_indices = np.nonzero(quadrant_sort)[0]\n",
    "#     print(len(sorted_indices))\n",
    "    sorted_eigs, sorted_indices =nonHermitianEigenSorter(rounded_beigenvals)\n",
    "    print(sorted_indices)\n",
    "    print(len(sorted_indices))\n",
    "    sorted_eigenmodes = bigW[:,sorted_indices];\n",
    "    #print(sorted_eigenmodes)\n",
    "    #adding real and imaginary parts seems to work...\n",
    "    sorted_eigenvals = beigenvals[sorted_indices]\n",
    "    \n",
    "    \n",
    "    Wp = sorted_eigenmodes[0:PQ:,0:PQ]\n",
    "    eigenvals_wp = (sorted_eigenvals[0:PQ]);    \n",
    "\n",
    "    eigenvals, W = LA.eig(np.linalg.inv(E_conv_inv)@B);\n",
    "    print(rounded_beigenvals)\n",
    "    #print('big: '+str(eigenvals_wp))\n",
    "    print(np.sqrt(eigenvals))\n",
    "    W = Wp;\n",
    "    #we should be gauranteed that all eigenvals are REAL\n",
    "    #eigenvals = eigenvals.astype('complex');\n",
    "    Q = np.diag(eigenvals_wp); #Q should only be positive square root of eigenvals\n",
    "    #Q = np.diag(np.sqrt(eigenvals))\n",
    "    V = E_conv_inv@(W@Q); #H modes\n",
    "\n",
    "    plt.subplot(141)\n",
    "    plt.plot(np.real(beigenvals), np.imag(beigenvals), '.'); plt.title('1st'); plt.ylim([-4,4])\n",
    "    plt.subplot(142)\n",
    "    plt.plot(np.real(eigenvals_wp), (np.imag(eigenvals_wp)), '.r', markersize = 10)\n",
    "    plt.plot(np.real(np.sqrt(eigenvals)), (np.imag(np.sqrt(eigenvals))), '.g', markersize = 5)\n",
    "\n",
    "    plt.ylim([-4,4])\n",
    "    plt.subplot(143);\n",
    "    plt.plot(np.real(beigenvals**2), np.imag(beigenvals**2), 'x');\n",
    "    plt.plot(np.real(eigenvals), np.imag(eigenvals), '.'); plt.title('2nd')\n",
    "\n",
    "    plt.ylim([-4,4])\n",
    "    plt.subplot(144)\n",
    "    plt.plot(np.real(np.sqrt(beigenvals**2)), np.imag(np.sqrt(beigenvals**2)), 'x');\n",
    "\n",
    "    plt.plot(np.real(np.sqrt(eigenvals)), np.imag(np.sqrt(eigenvals)), '.g'); plt.title('sqrt 2nd')\n",
    "    plt.ylim([-4,4])\n",
    "    plt.show();\n",
    "    \n",
    "    ## this is the great typo which has killed us all this time\n",
    "    X = np.diag(np.exp(-k0*np.diag(Q)*d)); #this is poorly conditioned because exponentiation\n",
    "    ## pointwise exponentiation vs exponentiating a matrix\n",
    "\n",
    "    ## observation: almost everything beyond this point is worse conditioned\n",
    "    k_I = k0**2*(n1**2 - (k_xi/k0)**2);                 #k_z in reflected region k_I,zi\n",
    "    k_II = k0**2*(n2**2 - (k_xi/k0)**2);   #k_z in transmitted region\n",
    "    k_I = k_I.astype('complex'); k_I = np.sqrt(k_I);\n",
    "    k_II = k_II.astype('complex'); k_II = np.sqrt(k_II);\n",
    "    Z_I = np.diag(k_I / (n1**2 * k0 ));\n",
    "    Z_II = np.diag(k_II /(n2**2 * k0));\n",
    "    delta_i0 = np.zeros((len(kx_array),1));\n",
    "    delta_i0[num_ord] = 1;\n",
    "    n_delta_i0 = delta_i0*j*np.cos(theta)/n1;\n",
    "\n",
    "    ## design auxiliary variables: SEE derivation in notebooks: RCWA_note.ipynb\n",
    "    # we want to design the computation to avoid operating with X, particularly with inverses\n",
    "    # since X is the worst conditioned thing\n",
    "\n",
    "    O = np.block([\n",
    "        [W, W],\n",
    "        [V,-V]\n",
    "    ]); #this is much better conditioned than S..\n",
    "    f = I;\n",
    "    g = j * Z_II; #all matrices\n",
    "    fg = np.concatenate((f,g),axis = 0)\n",
    "    ab = np.matmul(np.linalg.inv(O),fg);\n",
    "    a = ab[0:PQ,:];\n",
    "    b = ab[PQ:,:];\n",
    "\n",
    "    term = X @ a @ np.linalg.inv(b) @ X;\n",
    "    f = W @ (I+term);\n",
    "    g = V@(-I+term);\n",
    "    T = np.linalg.inv(np.matmul(j*Z_I, f) + g);\n",
    "    T = np.dot(T, (np.dot(j*Z_I, delta_i0) + n_delta_i0));\n",
    "    R = np.dot(f,T)-delta_i0; #shouldn't change\n",
    "    T = np.dot(np.matmul(np.linalg.inv(b),X),T)\n",
    "\n",
    "    ## calculate diffraction efficiencies\n",
    "    #I would expect this number to be real...\n",
    "    DE_ri = R*np.conj(R)*np.real(np.expand_dims(k_I,1))/(k0*n1*np.cos(theta));\n",
    "    DE_ti = T*np.conj(T)*np.real(np.expand_dims(k_II,1)/n2**2)/(k0*np.cos(theta)/n1);\n",
    "\n",
    "    #print(np.sum(DE_ri))\n",
    "    spectra.append(np.sum(DE_ri)); #spectra_T.append(T);\n",
    "    spectra_T.append(np.sum(DE_ti))\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "spectra = np.array(spectra);\n",
    "spectra_T = np.array(spectra_T)\n",
    "plt.figure();\n",
    "plt.plot(wavelength_scan, spectra);\n",
    "plt.plot(wavelength_scan, spectra_T)\n",
    "plt.plot(wavelength_scan, spectra+spectra_T)\n",
    "# plt.legend(['reflection', 'transmission'])\n",
    "# plt.axhline(((3.48-1)/(3.48+1))**2,xmin=0, xmax = max(wavelength_scan))\n",
    "# plt.axhline(((3.48-1)/(3.48+1)),xmin=0, xmax = max(wavelength_scan), color='r')\n",
    "#\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "plt.plot(spectra)\n",
    "plt.plot(spectra_T)\n",
    "plt.plot(np.array(spectra)+np.array(spectra_T))\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.0"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
